home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Leser 15
/
Amiga Plus Leser CD 15.iso
/
Games
/
AmySequencer
/
AmySequencer2.text
< prev
next >
Wrap
Text File
|
2002-03-13
|
119KB
|
3,303 lines
;i> 4 febbraio 1999
;m> 13 febbraio 1999
;m> 27,28,29,30,31 luglio 1999
;m> 1,3,6,7,8,11,12,13,16,21 agosto 1999
;m> 20,27,31 ottobre 1999
;m> 7,9,10,27,28 novembre 1999
;m> 4 dicembre 1999
;m> 14 maggio 2000
;m> 19,20,21,22,23,24,26,30,31 gennaio 2002
;m> 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18,19,20,22,23,24,27,28 febbraio 2002
;m> 1,2,3,4,5,6,7,8,10 marzo 2002
;---------------------------------
;--------------------------------
;dati per i colori dello schermo
;screen colours data
;--------------------
Data.b 0,0,0
Data.b 4,4,4
Data.b 8,8,8
Data.b 12,12,12
Data.b 12,0,0
Data.b 12,6,0
Data.b 12,12,0
Data.b 6,12,0
Data.b 0,12,0
Data.b 0,12,6
Data.b 0,12,12
Data.b 0,6,12
Data.b 0,0,12
Data.b 6,0,12
Data.b 12,0,12
Data.b 12,0,6
;------------------------------------------------------------------------
;il seguemte comando indica dove si trovano sul vostro computer i codici
; sorgenti di Blitz2 da includere in questo programma
;the following command states the place on your computer where are the Blitz2
; source codes to be included into this program
;-----------------------------------------------
INCDIR "Blitz2:Sorgenti/"
;-------------------------------------------------------------------------
;questo comando inserisce una sola volta in questo punto del programma il
; codice sorgente specificato
;-----------------------------
XINCLUDE "MIDIConstants.bb2"
;------------------------------------------------------------------------------
;le seguenti costanti servono per ricavare il periodo di un canale audio AMIGA
; dalla frequenza di campionamento
;the following constants are used to obtain an AMIGA audio channel period from the
; sampling frequency; there is one for PAL AMIGAs and one for NTSC AMIGAs
;-------------------------------------------------------------------------
;PAL timing
#TemporizzazionePAL=3546895
;NTSC timing
#TemporizzazioneNTSC=3579545
;-------------------------------------------------------------------------
;questa costante indica il numero di riferimento della fonte di caratteri
; Topaz8
;this constant states the characters font Topaz8 referring number
;-----------------------------------------------------------------
#FonteDiCaratteriTopaz8=0
;-------------------------------------------------------------------------
;questa variabile imposta il periodo minimo per i canali audio; il limite
; per i vecchi AMIGA e' 123, ma io ho scelto un periodo minimo di 125, che
; corrisponde ad un La nella nona ottava
;this variable sets the audio channels minimum period for the audio channels;
; on the oldest AMIGA the lowerst usable period is 123, but I have choosen a
; minimum period of 125, that is the A note in the ninth octave
;---------------------------------------------------------------
#PeriodoMinimo=125
;--------------------------------------------------------------------
;questa costante indica il numero di riferimento della tavolozza dei
; colori
;this constant states the colours palette referring number
;----------------------------------------------------------
#TavolozzaDeiColori=0
;--------------------------------------------------
;le seguenti costanti indicano il tipo di finestra
;the following constants state the window's kind
;------------------------------------------------
;window sizing gadget
#GadgetRidimensionaFinestra=1
;draggable window
#FinestraMovibile=2
;window depth gadget
#GadgetNascondiFinestra=4
;close gadget
#GadgetChiudiFinestra=8
;sizing window right border (you must set gimme-zero-zero to use it)
#BordoDestraFinestraRidimensionabile=16
;sizing window bottom border (you must set gimme-zero-zero to use it)
#BordoBassoFinestraRidimensionabile=32
;backdrop window
#FinestraDiSfondo=256
;gimme-zero-zero window
#DammiZeroZero=1024
;borderless window
#FinestraSenzaBordi=2048
;window active
#FinestraAttivata=4096
;------------------------------------------------
;le seguenti costanti indicano il tipo di gadget
;the following constants state the gadgets' kind
;------------------------------------------------
;invert
#InvertiGadget=1
;related to window's right side
#PosizioneRelativaAllaDestraDellaFinestra=2
;related to window'w bottom side
#PosizioneRelativaAlBassoDellaFinestra=4
;size as window's inner width
#ComeLarghezzaInternaFinestra=8
;size as window's inner height
#ComeAltezzaInternaFinestra=16
;box select
#ScatolaDaSelezionare=32
;horiziontal movement
#MovimentoOrizzontale=64
;vertical movement
#MovimentoVerticale=128
;no border
#NessunBordo=256
;exclude each other
#SiEscludonoLUnLAltro=512
;attach to window's right side
#AttaccaADestraDellaFinestra=1024
;attach to window's left side
#AttaccaASinistraDellaFinestra=2048
;attach to window's top
#AttaccaAllaFinestraInAlto=4096
;attach to window's bottom
#AttaccaAllaFinestraInBasso=8192
;gimme-zero-zero border gadget
#GadgetConMemoriaBordo=16384
;--------------------------------------------------------
;le seguenti costanti indicano gli eventi delle finestre
;tht following constants state window events
;--------------------------------------------
;you have pressed a mouse button
#HaiPremutoUnTastoDelTopo=8
;you have moved the mouse
#HaiMossoIlTopo=16
;you have pressed a gadget
#HaiPremutoUnGadget=32
;you have released a gadget
#HaiRilasciatoUnGadget=64
;you have activated a menu
#HaiAttivatoIlMenu=256
;you have closed the window
#HaiChiusoLaFinestra=512
;you have pressed a key
#HaiPremutoUnTasto=1024
;-------------------------------------------------------
;le seguenti costanti indicano i tasti premuti del topo
;the following constants state the pressed mouse buttons
;--------------------------------------------------------
;left mouse button
#TastoSinistroDelTopoPremuto=1
;right mouse button
#TastoDestroDelTopoPremuto=2
;-----------------------------------------------------------------------------
;le seguenti costanti indicano il valore ascii del tasti Backspace, Esc e dei
; tasti freccia
;the following constants state the ascii value for the Backspace, Esc and
; arrow keys
;------------
#Backspace=8
#Escape=27
#CursorUp=28
#CursorDown=29
#CursorRight=30
#CursorLeft=31
;Backspace key
TastoBackspace$=Chr$(#Backspace)
;Esc key
TastoEsc$=Chr$(#Escape)
;Cursor up key
TastoCursoreSu$=Chr$(#CursorUp)
;Cursor down key
TastoCursoreGiu$=Chr$(#CursorDown)
;Cursor right key
TastoCursoreDestra$=Chr$(#CursorRight)
;Cursor left key
TastoCursoreSinistra$=Chr$(#CursorLeft)
;-----------------------------------------------------------
;le seguenti costanti indicano i bottoni del joypad premuti
;the following constants state the joypad pressed buttons
;---------------------------------------------------------
#_PlayB=1
#_ReverseB=2
#_ForwardB=4
#_GreenB=8
#_YellowB=16
#_RedB=32
#_BlueB=64
;-------------------------------------------------------------------------
;le seguenti costanti indicano la direzione scelta con il joystick/joypad
;the following constants state the choosen direction by joystick/joypad
;-----------------------------------------------------------------------
#JoyMovedUp=0
#JoyMovedRight=2
#JoyMovedDown=4
#JoyMovedLeft=6
#JoyNotMoved=8
;main window
#FinestraPrincipale=0
;main window's gadget list
#ListaGadgetPrincipale=0
;main window's menu list
#ListaMenuPrincipale=0
;sounds editor window
#FinestraEditoreSuoni=1
;sounds editor window's gadget list
#ListaGadgetEditoreSuoni=1
;sound editor window's menu list
#ListaMenuEditoreSuoni=1
;notes editor window
#FinestraEditoreSequenza=2
;notes editor window's gadget list
#ListaGadgetEditoreSequenza=2
;notes editor window's menu list
#ListaMenuEditoreSequenza=2
;note editor window's zonetable
#TabellaZoneEditoreSequenza=0
;window to change basic note length
#FinestraCambioNotaBase=3
;basic note length change window's gadget list
#ListaGadgetCambioNotaBase=3
;basic note change window's zonetable
#TabellaZoneCambioNotaBase=1
;background pic's bitmap
#BitmapImmagineDiSfondo=0
;------------------------------------------------------------------------------
;queste costanti indicano i cambiamenti che possono essere applicati alle note
;these constants states different changes that can be applied to notes
;----------------------------------------------------------------------
;select an event
#SelezionaUnEvento=0
;change the channel of the selected events
#CambiaIlCanaleDegliEventiSelezionati=1
;put up by one the selected events
#AlzaDiUnoGliEventiSelezionati=2
;put down the selected notes of a semitone
#AbbassaDiUnoGliEventiSelezionati=3
;move the selected events forward
#SpostaAvantiNelTempoGliEventiSelezionati=4
;move the selected events back
#SpostaIndietroNelTempoGliEventiSelezionati=5
;increase the selceted events length
#AllungaLaDurataDelleNoteSelezionate=6
;decrease the selected events length
#RiduciLaDurataDelleNoteSelezionate=7
;delete the selected events
#EliminaGliEventiSelezionati=8
;select all the notes
#SelezionaTuttiGliEventi=9
;deselect all the notes
#DeselezionaTuttiGliEventi=10
;toggle selection of all notes
#InvertiLaSelezioneDiTuttiGliEventi=11
;select the events with the same height and of the same channel
#SelezionaGliEventiUguali=12
;add 10 to the selected events=13
#AggiungiDieciAgliEventiSelezionati
;sub 10 to the selected events
#SottraiDieciAgliEventiSelezionati=14
;put up the selected notes of one octave
#AlzaDiUnOttavaLeNoteSelezionate=15
;put down the selected notes of one octave
#AbbassaDiUnOttavaLeNoteSelezionate=16
;-------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle note visualizzate
;the following constants state the displayed notes drawing mode
;---------------------------------------------------------------
;unselected Event
#EventoNonSelezionato=0
;selected event
#EventoSelezionato=1
;Highlighted event
#EventoEvidenziato=2
;----------------------------------------------
;queste costanti indicano come suonare le note
;these constants state how to play notes
;----------------------------------------
;execute events from the main window
#EseguiGliEventiDallaFinestraPrincipale=0
;execute events from the sequence editor
#EseguiGliEventiDallEditoreSequenza=1
;---------------------------------------------------------------------------
;le seguenti costanti sono usate dal comando WJam per la selezione del modo
; grafico
;the following constants are used by WJam command for the graphic mode selection
;--------------------------------------------------------------------------------
;one colour with transparent background
#UnColoreConSfondoTrasparente=0
;two colours with full background
#DueColoriConSfondoPieno=1
; font height, notes invisible area, selected channel, note delta y
DEFTYPE .b AltezzaFonte,AreaInvisibileDelleNote,CanaleSelezionato,DeltaYNota
; mouse pressed key, AMIGA voice off,visible area start y,note position y,visible sequences
DEFTYPE .b TastoPremutoDelTopo, VoceSpenta, YInizioAreaVisibile, YPosizioneNota, SequenzeVisibili
; editor window inner height, editor window inner width
DEFTYPE .w AltezzaInternaFinestraEditoreSequenza,LarghezzaInternaFinestraEditoreSequenza
; screen height, note delta y,values visible area, screen height, selected sequence
DEFTYPE .w AltezzaSchermo,DeltaYNota, AreaVisibileDeiValori,LarghezzaSchermo,SequenzaSelezionata
; slider length, mouse x, mouse y, slider height
DEFTYPE .w XLunSlider, XTopo, YTopo, YLunSlider
; time invisible area, note delta x,Sequence duration,Events,Selected events, MIDI enabled
DEFTYPE .l AreaInvisibileDelTempo,DeltaXNota, DurataSequenza, Eventi,EventiSelezionati,MIDIAttivato
; visible area start x,note position x
DEFTYPE .l XInizioAreaVisibile, XPosizioneNota
;-----------------------------------------------------------------------------
;questa variabile indica la velocita' di esecuzione delle note, indicata come
; battute al minuto
;this variable states the notes execution velocity, stated as bars for minute
;-----------------------------------------------------------------------------
BattuteAlMinuto.w=120
;----------------------------------------------------------------------------
;questa costante indica il valore per cui bisogna moltiplicare o dividere la
; frequenza della nota per ricavare rispettivamente la nota successiva o la
; nota precedente e corrisponde a 2^(1/12)
;this constant states the value witch it must moltiply or divide the note
; frequency to obtain respectiveli the following note or the previous note and
; corresponds to 2^(1/12)
;-------------------------
DistanzaSemitono.f=1.05946309
;------------------------------------------
;questa variabile indica la fine del brano
;this variable states music end
;-------------------------------
FineMotivo.l=0
;--------------------------------------------------------------
;questa variabile, diventando Vera, vi fa uscire dal programma
;this variable, becaming True, let you quit the program
;-------------------------------------------------------
EsciDalProgramma.b=False
;------------------------------------------------------------------------------
;Questa variabile indica la larghezza di base delle note; puo' essere cambiata
; secondo i bisogni del momento
;This variable states the basic notes width; it can be changed depending of
; the needs of the moment
;-------------------------
LarghezzaNota.w=192
;-----------------------------------------------------
;questa stringa memorizza il carattere di nuova linea
;this string stores the new line character
;------------------------------------------
LF$=Chr$(10)
;------------------------------------------------------------------
;questa variabile indica se e' stata aperta la finestra principale
;this flag states if the main window is opened
;----------------------------------------------
FinestraPrincipaleAperta.b=False
;-------------------------------------------------------------
;questa variabile memorizza la prima sequenza da visualizzare
;this variable stores the first sequence to be displayed
;--------------------------------------------------------
PrimaSequenzaDaVisualizzare.w=0
;---------------------------------------------------------------
;questa variabile indica la scala di visualizzazione delle note
;this variable states the notes visualiziation scale
;----------------------------------------------------
ScalaNote.b=1
;-----------------------------------------------------------------------------
;questa variabile indica se la lista degli ultimi 5 progetti e' stata scritta
;this flag states if the last 5 loaded projects list has been written
;---------------------------------------------------------------------
StoriaDeiProgettiAperti.b=False
;------------------------------------------------------------------------
;La nota base, il quarto, corrisponde a 192 tick; questa costante indica
; quanti tick passano in un 50mo di secondo per un tempo di 120 battute al
; minuto
;The basic note, the quarter, correspond to 192 ticks; this constant signs how
; many tick takes place in a 50th of a second
;---------------------------------------------
TicPerCinquantesimoDiSecondo.f=30.72
;--------------------------------------------------------------------------
;la seguente variabile stringa indica il tipo di evento musicale corrente;
; all'inizio e' impostata sull'evento nota
;the following string variable states the current event; at the beginning is
; set on the note event
;-----------------------
TipoDiEvento$="Note"
;-----------------------------------------------------------------------
;questa variabile indica la posizione della voce Quit del menu' Project
;this variable marks the position of voice Quit in the Project menu
;-------------------------------------------------------------------
VoceMenuEsci.b=4
;-----------------------------------------------------------------------
;queste 5 variabili conterranno i nomi degli ultimi 5 progetti caricati
;this 5 variables will keep names of last 5 projects loaded
;-----------------------------------------------------------
Dim ProgettoAperto$(4)
;-----------------------------------------------------------------------------
;questa struttura di variabili e' una tabella di riferimento per il periodo e
; la frequenza associati ad ognuna delle 128 note possibili
;this variables structure is a refferring table for the periode and frequency
; paired to every one of the 128 given notes
;--------------------------------------------
NEWTYPE .PeriFreq
;--------
;periode
;--------
Periodo.l
;----------
;frequency
;----------
Frequenza.f
End NEWTYPE
Dim PeriFreq.PeriFreq(127)
;--------------------------------------------------------------------------
;la seguente struttura di variabili serve per identificare il tipo di note
;the following variables structure is used to states the notes kind
;-------------------------------------------------------------------
NEWTYPE .TipoDiNota
;note italian name
NomeItaliano$
;note english name
NomeInglese$
;diesis flag
Diesis.b
;note octave
Ottava.b
End NEWTYPE
Dim TipoDiNota.TipoDiNota(127)
;----------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione dei suoni
;the following variables structure is for sounds management
;-----------------------------------------------------------
NEWTYPE .Suono
;---------------------------------------------------
;questa variabile indica il nome del suono caricato
;this variable states the name of the loaded sound
;--------------------------------------------------
Nome$
;----------------------------------------------------------------------------
;questa variabile indica il canale associato al suono caricato; valore utile
; da 1 a 16
;this variable states the channel linked to the loaded sound; useful value
; from 1 to 16
;--------------
Canale.b
End NEWTYPE
Dim Suono.Suono(31)
NEWTYPE .Sequenza
;--------------------------------------------------
;questa variabile memorizza il nome della sequenza
;this variable stores the sequence name
;---------------------------------------
Nome$
;----------------------------------------------------------
;questa variabile indica l'inizio temporale della sequenza
;this variable states the sequence time start
;---------------------------------------------
Inizio.l
;---------------------------------------------------------
;questa variabile indica la fine temporale della sequenza
;this variable states the sequence time end
;-------------------------------------------
Durata.l
;------------------------------------------------------------------
;questa variabile indica gli eventi musicali totali della sequenza
;this variable states the sequence's total musical events
;---------------------------------------------------------
Eventi.l
;-----------------------------------------------------------------------
;questa variabile indica gli eventi musicali selezionati della sequenza
;this variable states the sequence's selected musical events
;------------------------------------------------------------
EventiSelezionati.l
End NEWTYPE
Dim Sequenza.Sequenza(499)
;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione degli eventi musicali
;the following vars structure is for the musical events management
;------------------------------------------------------------------
NEWTYPE .EventoMusicale
;----------------------------------------------------------------------------
;questa variabile stringa indica il tipo di evento musicale, che puo' essere
; una nota od un parametro MIDI
;This string variable states the musical event kind, that can be a note or a
; MIDI parameter
;----------------
Tipo$
;-----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica l'altezza;
; valore utile da zero a 127
;if the event is a note, this variable states its height; useful value from
;zero to 127
;------------
Evento.b
;----------------------------------------------------------------------------
;questa variabile indica la posizione dell'evento musicale nel tempo in tic;
; valore utile da zero a 2 miliardi e rotti
;this variable states musical event position in time by ticks; useful value
;from zero to over 2 billions
;-----------------------------
Inizio.l
;------------------------------------------------------------------------------
;questa varibile indica il canale dell'evento musicale; valore utile da 1 a 16
;this variable states musical event's channel; useful value from 1 to 16
;------------------------------------------------------------------------
Canale.b
;-----------------------------------------------------------------------------
;questa variabile identifica la sequenza di appartenenza dell'evento musicale
; valore utile da 1 a 500
;this variable states the sequence witch the musical event belong to: useful
; value from 1 to 500
;---------------------
Sequenza.w
;------------------------------------------------------------------
;questa variabile indica se l'evento musicale e' stato selezionato
;this variable states if the musical event has been selected
;------------------------------------------------------------
Selezionato.b
;----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile indica se e' stata
; suonata: se il valore e' zero, la nota non e' stata ancora EseguiGliEventita; se il
; valore e' 1, il programma sta do la nota; se il valore e' 2, il
; programma ha smesso di suonare la nota
;if the musical event is a note, this variable states if it has been played:
; if the value is zero, the note has not been played yet; if the value is 1,
; the program is playing the note; if the value is 2, the program has finished
; to play the note
;------------------
Eseguito.b
;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica in tic la durata
; nel tempo; valore utile da 0 a 2 miliardi e rotti (192 tic=nota di un quarto)
;if the event is a note, this variable states its duration in time by ticks;
;useful value from zero to over 2 billions (192 ticks=a quarter note)
;---------------------------------------------------------------------
Durata.l
;--------------------------------------------------------------------------
;se l'evento musicale e'una nota, questa variabile ne indica l'intensita',
;cioe' il suo volume; se invece l'evento e' un controllo ne indica il valore
;if the musical event is a note, this variable states its intensity, that is
; its volume; if instead is a control it states its value
;---------------------------------------------------------
Valore.b
;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile indica quale voce AMIGA e'
; stata usata per suonarla
;if the musical event si a note, this variable states witch AMIGA voice has
; been used to play it
;----------------------
VoceUsata.b
End NEWTYPE
DEFTYPE .EventoMusicale NotaSuonata
;-----------------------------------------------------
;imposta il numero massimo di eventi musicali usabili
;sets the maximun musical events handling
;-----------------------------------------
MassimoEventiMusicali.l=Min((FastFree-65536)/SizeOf .EventoMusicale,32768)
;---------------------------------------------------------------------------
;crea le variabili array lista con la struttura del NEWTYPE .EventoMusicale
;creates the list array variables with the NEWTYPE .EventoMusicale structure
;----------------------------------------------------------------------------
Dim List EventoMusicale.EventoMusicale(MassimoEventiMusicali-1)
;-----------------------------------------------------------------
;questa variabile indica se e' stato attivato un dispoditivo MIDI
;this variable states if a MIDI device has been activated
;---------------------------------------------------------
MIDIAttivato.l=0
;--------------------------------------------------------------------------
;questa procedura imposta la fonte di caratteri Topaz8 per schermo, menu e
; requester, ma non per le finestre
;this procedure sets the characters font Topaz8 for screen, menus and
; requester, but not for windows
;--------------------------------
Statement CaricaLaFonteDiCaratteriTopaz8{}
SHARED AltezzaFonte
AltezzaFonte=8:LoadFont #FonteDiCaratteriTopaz8,"topaz.font",AltezzaFonte
End Statement
Statement ImpostaIlParlatoDellAmiga{}
SetVoice 130,250,0,1,64,22200
End Statement
Statement CaricaLeImmaginiDelleNote{}
BitMap 0,126,16,1
LoadBitMap 0,"Notes.2Cols"
GetaShape 0,0,0,22,16
GetaShape 1,23,0,12,16
GetaShape 2,36,0,12,16
GetaShape 3,49,0,17,16
GetaShape 4,67,0,17,16
GetaShape 5,85,0,17,16
GetaShape 6,103,0,17,16
GetaShape 7,121,0,5,16
Free BitMap 0
End Statement
Statement AttivaMIDI{}
SHARED LF$
SHARED MIDIAttivato
Use Window #FinestraPrincipale
WJam #DueColoriConSfondoPieno
Repeat
If MIDIAttivato=True Then CloseSerial 0
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3:Print "Please type your MIDI device name>"
DispositivoMIDI$=StripLead$(StripTrail$(Edit$("serial.device",35),Asc(" ")),Asc(" "))
WLocate 0,0:Print SPACE$(80)
If DispositivoMIDI$<>""
MIDIAttivato=OpenSerial(DispositivoMIDI$,0,31250,16)
If MIDIAttivato=0
EZRequest "AmySequencer message","Unable to open MIDI"+LF$+"on "+DispositivoMIDI$,"OK"
Else
MIDIAttivato=True
EndIf
EndIf
Until MIDIAttivato=True
EZRequest "AmySequencer message","MIDI has been activated"+LF$+"on "+DispositivoMIDI$,"OK"
WJam #UnColoreConSfondoTrasparente
End Statement
Statement MostraGliEventiMusicaliDisponibili{}
SHARED MassimoEventiMusicali
SHARED Sequenza()
SHARED TotaleEventiMusicali
TotaleEventiMusicali=0
For Sequenza.w=1 To 500
TotaleEventiMusicali+Sequenza(Sequenza-1)\Eventi
Next Sequenza
Use Window #FinestraPrincipale
WLocate 0,0:WColour 3:Print MassimoEventiMusicali," events allocated, ",TotaleEventiMusicali," event"
If TotaleEventiMusicali<>1 Then Print "s"
Print " used"
End Statement
;----------------------------------------------------------------------------
;questa procedura crea una tabella di riconoscimento delle note, memorizzata
; nell'array TipoDiNota()
;this procedure crates a referring note recognition table, stored in the
; TipoDiNota() array (that means Note Kind)
;-------------------------------------------
Statement ImpostaIlTipoDiNota{Nota.b}
SHARED TipoDiNota()
;--------------------------------------------
;questa variabile indica l'ottava della nota
;this variable state the note octave
;------------------------------------
OttavaDellaNota.b=Nota/12
TipoDiNota(Nota)\Ottava=OttavaDellaNota
;-----------------------------------------------------------------------
;questa variabile indica a quali delle 12 note dodici note fondamentali
; corrisponde la nota corrente
;this variable marks which of 12 fundamental notes corresponds the current
; note
;------
NotaNellOttava.b=Nota MOD 12
Select NotaNellOttava
;------------------
;la nota e' un Do?
;is the given note a C?
;-----------------------
Case 0
TipoDiNota(Nota)\NomeItaliano="Do"
TipoDiNota(Nota)\NomeInglese="C"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Do diesis (Do#)?
;is the given note a C diesis (C#)?
;-----------------------------------
Case 1
TipoDiNota(Nota)\NomeItaliano="Do#"
TipoDiNota(Nota)\NomeInglese="C#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Re?
;is the given note a D?
;-----------------------
Case 2
TipoDiNota(Nota)\NomeItaliano="Re"
TipoDiNota(Nota)\NomeInglese="D"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Re diesis (Re#)?
;is the given note a D diesis (D#)?
;-----------------------------------
Case 3
TipoDiNota(Nota)\NomeItaliano="Re#"
TipoDiNota(Nota)\NomeInglese="D#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Mi?
;is the given note a E?
;-----------------------
Case 4
TipoDiNota(Nota)\NomeItaliano="Mi"
TipoDiNota(Nota)\NomeInglese="E"
TipoDiNota(Nota)\Diesis=False
;------------------
;la nota e' un Fa?
;is the given note a F?
;-----------------------
Case 5
TipoDiNota(Nota)\NomeItaliano="Fa"
TipoDiNota(Nota)\NomeInglese="F"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Fa diesis (Fa#)?
;is the given note a F diesis (F#)?
;-----------------------------------
Case 6
TipoDiNota(Nota)\NomeItaliano="Fa#"
TipoDiNota(Nota)\NomeInglese="F#"
TipoDiNota(Nota)\Diesis=True
;-------------------
;la nota e' un Sol?
;is the given note a G?
;-----------------------
Case 7
TipoDiNota(Nota)\NomeItaliano="Sol"
TipoDiNota(Nota)\NomeInglese="G"
TipoDiNota(Nota)\Diesis=False
;---------------------------------
;la nota e' un Sol diesis (Sol#)?
;is the given note a G diesis (G#)?
;-----------------------------------
Case 8
TipoDiNota(Nota)\NomeItaliano="Sol#"
TipoDiNota(Nota)\NomeInglese="G#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un La?
;is the given note an A?
;------------------------
Case 9
TipoDiNota(Nota)\NomeItaliano="La"
TipoDiNota(Nota)\NomeInglese="A"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un La diesis (La#)?
;is the given note an A diesis (A#)?
;------------------------------------
Case 10
TipoDiNota(Nota)\NomeItaliano="La#"
TipoDiNota(Nota)\NomeInglese="A#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Si?
;is the given note a B?
;-----------------------
Case 11
TipoDiNota(Nota)\NomeItaliano="Si"
TipoDiNota(Nota)\NomeInglese="B"
TipoDiNota(Nota)\Diesis=False
End Select
End Statement
Statement CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
SHARED PeriFreq()
SHARED DistanzaSemitono
;--------------------------------------------------------------------------------
;per ottenere la frequenza di tutte le 128 note, si parte dal La della 2a ottava
; (la prima e' l'ottava zero), la cui frequenza e' nota e la si moltiplica o
; divide per la distanza minima tra due note che e' il semitono; per ottenere il
; periodo si divide una delle costanti di temporizzazione, a seconda che il
; il proprio AMIGA usi uno schermo PAL o NTSC, per la frequenza della nota; queste
; costanti sono riportate sul MANUALE DI RIFERIMENTO PER L'HARDWARE AMIGA.
;to obtain all 128 notes it starts from the A from the 3rd octave (the 1st is the
; zero octave) that has a known frequency, and it multiply or divide this for the
; minimum distance between two notes that is the semitone; to obtain the period it
; divides one of the timing constants, depending on your AMIGA uses a PAL or NTSC
; screen, for the note frequency; these constants are reported the AMIGA HARDWARE
; REFERENCE MANUAL
;------------------
PeriFreq(45)\Frequenza=440
If NTSC=True
PeriFreq(45)\Periodo=#TemporizzazioneNTSC/PeriFreq(45)\Frequenza
Else
PeriFreq(45)\Periodo=#TemporizzazionePAL/PeriFreq(45)\Frequenza
EndIf
ImpostaIlTipoDiNota{45}
For Nota.w=46 To 127
PeriFreq(Nota)\Frequenza=PeriFreq(Nota-1)\Frequenza*DistanzaSemitono
If NTSC=True
PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
Else
PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
EndIf
ImpostaIlTipoDiNota{Nota}
Next Nota
For Nota=44 To 0 Step -1
PeriFreq(Nota)\Frequenza=PeriFreq(Nota+1)\Frequenza/DistanzaSemitono
If NTSC=True
PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
Else
PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
EndIf
ImpostaIlTipoDiNota{Nota}
Next Nota
End Statement
;-----------------------------------------------------------------------------
;la seguente procedura converte un valore temporale da tic in battute, quarti
; e tic; la variabile OrigineZero serve per la differente visualizzazione
; della durata delle note che parte da zero
;the following procedure converts a time value from tcksin bars, quarters and
; ticks; the OrigineZero variable is used for the different note length
; displaying that starts from zero
;----------------------------------
Statement ConvertiIlTempoInBattute{Tempo.l,OrigineZero.b}
If OrigineZero=True
Battute.w=Tempo/(192*4)
Quarti=((Tempo/192) MOD 4)
Else
Battute=Tempo/(192*4)+1
Quarti=((Tempo/192) MOD 4)+1
EndIf
Print Battute,".",Quarti
Tic.w=Tempo MOD 192
If Tic>0 Then Print ".",Tic
End Statement
;-------------------------------------------------
;questa procedura imposta le barre di scorrimento
;this procedure sets sliders
;----------------------------
Statement ImpostaSlider{Slider.l,XPos.w,YPos.w,Orientamento$,Parametri.l,ListaGadgetSlider.l}
SHARED XLunSlider
SHARED YLunSlider
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL" Then Parametri+#MovimentoOrizzontale
If Orientamento$="VERTICAL" Then Parametri+#MovimentoVerticale
PropGadget ListaGadgetSlider,XPos,YPos,Parametri,Slider,XLunSlider,YLunSlider
End Statement
;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manages the sliders
;-----------------------------------
Statement MostraSlider{Slider.l,ValoreDato.l,ValoreMassimo.l,Orientamento$,ListaGadgetSlider.l,FinestraSlider.l}
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL"
SetHProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
EndIf
If Orientamento$="VERTICAL"
SetVProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
EndIf
Redraw FinestraSlider,Slider
End Statement
;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manage the sliders
;----------------------------------
Function .l ValoreSlider{Slider.l,ValoreMassimo.l,LunghezzaSlider.l,Orientamento$,ListaGadgetSlider.l}
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL"
ValoreSlider.f=HPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
ValoreIndicatoDalTopo.w=EMouseX*ValoreMassimo/LunghezzaSlider
EndIf
If Orientamento$="VERTICAL"
ValoreSlider=VPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
ValoreIndicatoDalTopo=EMouseY*ValoreMassimo/LunghezzaSlider
EndIf
ValoreIndicatoDalloSlider.l=Int(ValoreSlider)
If ValoreIndicatoDalTopo>ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider+1
If ValoreIndicatoDalTopo<ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider-1
ValoreIndicatoDalloSlider=Min(Max(ValoreIndicatoDalloSlider,0),ValoreMassimo)
Function Return ValoreIndicatoDalloSlider
End Function
;--------------------------------------------------------------
;questa procedura cancella il file storico dei progetti aperti
;this procedure clears the loaded projects history file
;-------------------------------------------------------
Statement CancellaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
KillFile "ProjectsHistory"
VoceMenuEsci=4
StoriaDeiProgettiAperti=False
For ProgettoAperto.b=0 To 4
ProgettoAperto$(ProgettoAperto)=""
Next ProgettoAperto
End Statement
;------------------------------------------------------------
;questa procedura carica il file storico dei progetti aperti
;this procedure loads the loaded projects history file
;------------------------------------------------------
Statement CaricaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
StoriaDeiProgettiAperti=ReadFile(0,"ProjectsHistory")
If StoriaDeiProgettiAperti=True
FileInput 0
ProgettoAperto=0
Repeat
Dato$=Inkey$
If Dato$=Chr$(10)
ProgettoAperto+1
VoceMenuEsci+1
Else
ProgettoAperto$(ProgettoAperto)+Dato$
EndIf
Until Dato$=""
CloseFile 0
PopInput
EndIf
End Statement
Statement CaricaLaBitmapDiSfondo{}
;----------------------------------------
;crea la bitmap per l'immagine di sfondo
;creates the bitmap for the background pic
;------------------------------------------
BitMap #BitmapImmagineDiSfondo,640,240,4
;------------------------------------
;inizializza la tavolozza dei colori
;initializes colours palette
;----------------------------
InitPalette #TavolozzaDeiColori,16
;------------------------------------------------------------------------------
;carica l'immagine di sfondo per la finestra principale nella bitmap creata per
; questa
;loads the main window background image into the bitmap creted for it
;-------------------------------------------------------
LoadBitMap #BitmapImmagineDiSfondo,"BackgroundPic.16Cols",#TavolozzaDeiColori
End Statement
;------------------------------------
;questa procedura imposta lo schermo
;this procedure sets the screen
;-------------------------------
Statement ImpostaLoSchermo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED SequenzeVisibili
;--------------------------------------
;imposta la fonte di caratteri globale
;sets the global characters font
;--------------------------------
Use IntuiFont #FonteDiCaratteriTopaz8
;-------------------------------
;carica i colori per lo schermo
;loads colours for screen
;-------------------------
; For Colore.b=0 To 15
; Read Rosso.b
; Read Verde.b
; Read Blu.b
; PalRGB #TavolozzaDeiColori,Colore,Rosso,Verde,Blu
; Next Colore
;----------------------------------------------------------------
;imposta le penne dello schermo con i migliori colori (ROM 2.0+)
;sets screen pens with best colours (ROM 2.0+)
;----------------------------------------------
ScreenPens 3,2,0,1,3,1,2
;------------------------------------------------
;apre lo schermo in alta risoluzione a 16 colori
;opens high resolution screen with 16 colours
;---------------------------------------------
Screen 0,4+8,"AmySequencer by Stefano Maria Regattin"
;-----------------------------
;usa la tavolozza dei colori
;use colours palette
;--------------------
Use Palette #TavolozzaDeiColori
;-------------------------------------------------------------------------------
;questa variabile contiene l'indirizzo di memoria della struttura dello schermo
;this variable retains the screen structure memory address
;----------------------------------------------------------
IndirizzoSchermo.l=Peek.l(Addr Screen(0))
;----------------------------------------------------------
;questa variabile contiene la vera larghezza Dello schermo
;this variable retains the true screen width
;--------------------------------------------
LarghezzaSchermo=Peek.w(IndirizzoSchermo+12)
;--------------------------------------------------------
;questa variabile contiene la vera altezza dello schermo
;this variable retains the true screen height
;---------------------------------------------
AltezzaSchermo=Peek.w(IndirizzoSchermo+14)
;---------------------------------------------------------------------
;questa variabile indica il massimo numero di sequenze visualizzabili
;this variable states the displayed sequences maximum number
;------------------------------------------------------------
SequenzeVisibili.b=(AltezzaSchermo-(AltezzaFonte+3)-8-8-8)/8
End Statement
;-----------------------------------------------------------------------
;questa procedura mostra l'immagine di sfondo nella finestra principale
;this procedure shows the background pic into the main window
;--------------------------------------------------------------
Statement MettiLImmagineDiSfondoNellaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
;-----------------------------------------------------------
;copia l'immamginea dalla bitmap nella finestra principale
;copies the pic from the bitmap into the main window
;----------------------------------------------------
BitMaptoWindow #BitmapImmagineDiSfondo,#FinestraPrincipale,0,0,0,0,640,240
End Statement
;-------------------------------------------------------------------------------
;Questa procedura imposta la finestra principale invisibile e reimposta il menu
; principale
;this procedure sets the main invisible window and resets the main menu
;-----------------------------------------------------------------------
Statement ImpostaLaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED BattuteAlMinuto
SHARED FinestraPrincipaleAperta
SHARED LarghezzaSchermo
SHARED ProgettoAperto$()
SHARED SequenzeVisibili
SHARED StoriaDeiProgettiAperti
SHARED TicPerCinquantesimoDiSecondo
SHARED VoceMenuEsci
SHARED XLunSlider
SHARED YLunSlider
;-----------------------------------------------
;se la finestra era gia' stato aperto la chiude
;if window was opened it close it
;---------------------------------
If FinestraPrincipaleAperta=True
BeepScreen 0
Free GadgetList #ListaGadgetPrincipale
Free MenuList #ListaMenuPrincipale
CloseWindow #FinestraPrincipale
EndIf
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
;-------------------------
;imposta il menu' Project
;sets Project menu
;------------------
MenuTitle #ListaMenuPrincipale,0,"Project"
MenuItem #ListaMenuPrincipale,0,0,0,"New"
MenuItem #ListaMenuPrincipale,0,0,1,"Load"
MenuItem #ListaMenuPrincipale,0,0,2,"Save"
MenuItem #ListaMenuPrincipale,0,0,3,"Save as"
If StoriaDeiProgettiAperti=True
For ProgettoAperto.b=4 To VoceMenuEsci-1
MenuItem 0,0,0,ProgettoAperto,ProgettoAperto$(ProgettoAperto-4)
Next ProgettoAperto
EndIf
MenuItem 0,0,0,VoceMenuEsci,"Quit"
;--------------------------
;imposta il menu' Controls
;sets Controls menu
;------------------
MenuTitle #ListaMenuPrincipale,1,"Controls"
MenuItem #ListaMenuPrincipale,0,1,0,"Play"
;-------------------------
;imposta il menu' Windows
;sets Windows menu
;------------------
MenuTitle #ListaMenuPrincipale,2,"Windows"
MenuItem #ListaMenuPrincipale,0,2,0,"Sounds Editor"
MenuItem #ListaMenuPrincipale,0,2,1,"Sequence Editor"
;-----------------------
;imposta il menu' Prefs
;sets Prefs menu
;----------------
MenuTitle #ListaMenuPrincipale,3,"Prefs"
MenuItem #ListaMenuPrincipale,0,3,0,"Set MIDI device"
MenuItem #ListaMenuPrincipale,0,3,1,"Clear projects history"
;-------------------------------------------------------------------
;apre la finestra principale per ricavarne la larghezza e l'altezza
;opens main window to obtain its width and height
;-------------------------------------------------
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#FinestraDiSfondo+#FinestraSenzaBordi+#FinestraAttivata
Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;-------------------------------------------------------------------------
;questa variabile conserva la larghezza interna della finestra principale
;this variable stores the inner witdh of the main window
;--------------------------------------------------------
LarghezzaInternaFinestraPrincipale.w=InnerWidth
;----------------------------------------------------------------------
;questa variabile conserva l'altezza interna della finestra principale
;this variable stores the inner height of the main window
;---------------------------------------------------------
AltezzaInternaFinestraPrincipale.w=InnerHeight
CloseWindow #FinestraPrincipale
;----------------------------------------------------------------------
;imposta la barra di scorrimento che regola la velocita' di esecuzione
;sets the slider that tunes the execution velocity
;_-------------------------------------------------
XLunSlider=LarghezzaInternaFinestraPrincipale
YLunSlider=8
ImpostaSlider{1,0,AltezzaInternaFinestraPrincipale-8,"HORIZONTAL",0,#ListaGadgetPrincipale}
;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
XLunSlider=16
YLunSlider=SequenzeVisibili*8
ImpostaSlider{2,0,8,"VERTICAL",0,#ListaGadgetPrincipale}
;------------------------------------------------------------------------------
;apre la finestra principale solo per il menu' come invisibile e ci attacca la
; lista dei gadget principale
;opens main window for menu usage only as invisible and it attaches the main
; gadget list
;-------------
Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetPrincipale
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuPrincipale
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #UnColoreConSfondoTrasparente
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
XLunSlider=LarghezzaInternaFinestraPrincipale
MostraSlider{1,BattuteAlMinuto-10,300-9,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
;-------------------------------------------------------------------
;mostra la velocita' di esecuzione delle note in battute per minuto
;shows the execution velocity in bar per minute
;-----------------------------------------------
WLocate 0,AltezzaInternaFinestraPrincipale-8-8:WColour 3
Print "BPM>",BattuteAlMinuto," Ticks/50th>",TicPerCinquantesimoDiSecondo
;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
MostraSlider{2,PrimaSequenzaDaVisualizzare,499-SequenzeVisibili,"VERTICAL",#ListaGadgetPrincipale,#FinestraPrincipale}
;-----------------------------------------------------------------
;le finestre di richiesta sono assegnate alla finestra principale
;the request windows are assigned to main window
;------------------------------------------------
EZOutput #FinestraPrincipale
FinestraPrincipaleAperta=True
End Statement
;--------------------------------------------------------------------------
;questa procedura per ora legge solo il nome di un file e o inserisce nel
; menu principale; dovrebbe caricare un progetto di AmySequencer
;this procedure till now only reads a file name and put it into the main menu
; it should load an AmySequencer project
;----------------------------------------
Statement CaricaUnProgetto{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
MaxLen P$=160
MaxLen F$=64
ProgettoAperto$=FileRequest$("Load AmySequencer project",P$,F$)
If ProgettoAperto$<>""
For ProgettoAperto.b=0 To 4
If ProgettoAperto$=ProgettoAperto$(ProgettoAperto) Then Statement Return
Next ProgettoAperto
For ProgettoAperto=3 To 0 Step -1
ProgettoAperto$(ProgettoAperto+1)=ProgettoAperto$(ProgettoAperto)
Next ProgettoAperto
ProgettoAperto$(0)=ProgettoAperto$
StoriaDeiProgettiAperti=WriteFile(0,"ProjectsHistory")
If StoriaDeiProgettiAperti=True
FileOutput 0
For ProgettoAperto=0 To 4
If ProgettoAperto$(ProgettoAperto)<>""
NPrint ProgettoAperto$(ProgettoAperto)
EndIf
Next ProgettoAperto
CloseFile 0
PopOutput
VoceMenuEsci+1
EndIf
EndIf
End Statement
;-----------------------------------------------------------
;questa procedura imposta i suoni da usare con il programma
;this procedure sets sounds to use with program
;-----------------------------------------------
Statement EditoreSuoni{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED LF$
SHARED PercorsoSuoni$
SHARED Suono()
SHARED XLunSlider
SHARED YLunSlider
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
MenuTitle #ListaMenuEditoreSuoni,0,"Sounds"
MenuItem #ListaMenuEditoreSuoni,0,0,0,"Load"
MenuItem #ListaMenuEditoreSuoni,0,0,1,"Discard"
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#GadgetChiudiFinestra+#DammiZeroZero+#FinestraAttivata
Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1
LarghezzaInternaFinestraEditoreSuoni.w=InnerWidth
AltezzaInternaFinestraEditoreSuoni.w=InnerHeight
CloseWindow #FinestraEditoreSuoni
;-------------------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare i suoni disponibili
;sets the slider that is used to show the available sounds
;_---------------------------------------------------------
XLunSlider=16
YLunSlider=AltezzaInternaFinestraEditoreSuoni
ImpostaSlider{1,LarghezzaInternaFinestraEditoreSuoni-16,0,"VERTICAL",0,#ListaGadgetEditoreSuoni}
Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1,#ListaGadgetEditoreSuoni
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuEditoreSuoni
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #DueColoriConSfondoPieno
;----------------------------------
;sounds window's displaying start
;----------------------------------
InizioSuoni.b=0
;------------------------
;maximum strings length
;------------------------
LunghezzaMassimaStringhe.b=(LarghezzaInternaFinestraEditoreSuoni-16)/8
;-----------------------------
;stated by mouse sound number
;-----------------------------
SuonoIndicatoDalTopo.b=-1
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
YLunSlider=AltezzaInternaFinestraEditoreSuoni
MostraSlider{1,InizioSuoni,2,"VERTICAL",#ListaGadgetEditoreSuoni,#FinestraEditoreSuoni}
Repeat
WCls
If SuoniCaricati.b>31 Then Enable #ListaGadgetEditoreSuoni,1 Else Disable #ListaGadgetEditoreSuoni,1
Redraw #FinestraEditoreSuoni,1
WLocate 0,0
;----------------------
;loaded sounds counter
;----------------------
SuoniCaricati=0
For Suono.b=0 To 30
AssegnamentoSuono$=Suono(InizioSuoni+Suono)\Nome
If AssegnamentoSuono$<>""
CanaleSuono.b=Suono(InizioSuoni+Suono)\Canale
If CanaleSuono>0 Then WColour CanaleSuono-1,16-CanaleSuono Else WColour 1,0
Format "00"
If CanaleSuono>0 Then CanaleSuono$=" channel "+Str$(CanaleSuono) Else CanaleSuono$=" no channel"
Format""
AssegnamentoSuono$+CanaleSuono$
AssegnamentoSuono$=Right$(AssegnamentoSuono$,LunghezzaMassimaStringhe)
AssegnamentoSuono$+SPACE$(LunghezzaMassimaStringhe-Len(AssegnamentoSuono$))
NPrint AssegnamentoSuono$
SuoniCaricati+1
EndIf
Next Suono
EventoFinestraEditoreSuoni.l=WaitEvent
Select EventoFinestraEditoreSuoni
Case #HaiPremutoUnTastoDelTopo
TastoCliccatoDelTopo.b=MButtons:YTopo=WMouseY
If TastoCliccatoDelTopo=1
SuonoIndicatoDalTopo=YTopo/8+InizioSuoni
If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati
CanaleSuono.b=Suono(SuonoIndicatoDalTopo)\Canale
CanaleSuono+1:If CanaleSuono=17 Then CanaleSuono=0
Suono(SuonoIndicatoDalTopo)\Canale=CanaleSuono
EndIf
FlushEvents #HaiPremutoUnTastoDelTopo
EndIf
Case #HaiPremutoUnGadget
If SuoniCaricati>31
InizioSuoni=ValoreSlider{1,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
EndIf
Case #HaiRilasciatoUnGadget
If SuoniCaricati>31
InizioSuoni=ValoreSlider{1,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
EndIf
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=0
If SuoniCaricati<32
MaxLen PercorsoSuoni$=160
MaxLen NomeSuono$=64
NomeSuono$=FileRequest$("Load a sound...",PercorsoSuoni$,NomeSuono$)
If NomeSuono$<>""
StessoSuono.b=False
If SuoniCaricati>0
For SuonoPrecedente=0 To SuoniCaricati-1
If NomeSuono$=Suono(SuonoPrecedente)\Nome Then StessoSuono=True
Next SuonoPrecedente
EndIf
If StessoSuono=False
Suono=SuoniCaricati
LoadSound Suono,NomeSuono$
Suono(Suono)\Nome=NomeSuono$
Sound Suono,3
EndIf
EndIf
EndIf
EndIf
If MenuHit=0 AND ItemHit=1
If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati AND SuonoIndicatoDalTopo>-1
Suono=SuonoIndicatoDalTopo
Free Sound Suono
Suono(Suono)\Nome=""
While Suono+1<SuoniCaricati
Suono(Suono)\Nome=Suono(Suono+1)\Nome
Suono(Suono)\Canale=Suono(Suono+1)\Canale
Suono+1
Wend
Suono(Suono)\Nome=""
Suono(Suono)\Canale=0
SuonoIndicatoDalTopo=-1
EndIf
EndIf
Case #HaiChiusoLaFinestra
SuoniAssegnatiAlloStessoCanale.b=False
For SuonoUno.b=0 To 31
For SuonoDue.b=0 To 31
If SuonoUno<>SuonoDue
If Suono(SuonoUno)\Canale>0 AND Suono(SuonoUno)\Canale=Suono(SuonoDue)\Canale
SuoniAssegnatiAlloStessoCanale=True
EndIf
EndIf
Next SuonoDue
Next SuonoUno
If SuoniAssegnatiAlloStessoCanale=True
Messaggio$="You have two or more sounds"+LF$+"assigned to the same channel;"+LF$+"please adjust all better!"
EZRequest "AmySequencer message",Messaggio$,"OK"
Else
EsciDallEditoreSuoni.b=True
EndIf
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
Select TastoPremuto$
Case TastoEsc$
EsciDallEditoreSuoni=True
Case TastoCursoreSu$
Case TastoCursoreGiu$
End Select
End Select
Until EsciDallEditoreSuoni=True
CloseWindow #FinestraEditoreSuoni
Use Window #FinestraPrincipale
WJam #UnColoreConSfondoTrasparente
End Statement
;-----------------------------------------------------
;questa procedura cancella a video un evento musicale
;this procedure clears on screen a musical event
;------------------------------------------------
Statement CancellaUnEventoMusicale{TipoDiEvento$,Evento.b,InizioEvento.l,DurataEvento.l,EventoSelezionato.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaInvisibileDelleNote
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Select TipoDiEvento$
Case "Note"
NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
I.w=16+InizioNota/ScalaNote-XInizioAreaVisibile
F.w=16+FineNota/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
InizioNotaVisibile.b=True
Else
InizioNotaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
FineNotaVisibile.b=True
Else
FineNotaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
NotaVisibile.b=True
Else
If InizioNotaVisibile=True OR FineNotaVisibile=True
NotaVisibile=True
Else
NotaVisibile=False
EndIf
EndIf
If NotaVisibile=True
X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
If TipoDiNota(Nota)\Diesis=True
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,0
Else
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,3
EndIf
EndIf
EndIf
Case "Program"
Programma.b=AreaVisibileDeiValori*(127-Evento)/128
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
For Linea.b=0 To 7
Y.w=Programma+Linea:LunghezzaEvento.w=Len("Program000")*8-1
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,I+LunghezzaEvento,Y,0
Else
Wline I,Y,I+LunghezzaEvento,Y,3
EndIf
Next Linea
EndIf
Case "Control"
Controllo.b=AreaVisibileDeiValori*(127-Evento)/128
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
For Linea.b=0 To 7
Y.w=Controllo+Linea:LunghezzaEvento=Len("Control000")*8-1
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,I+LunghezzaEvento,Y,0
Else
Wline I,Y,I+LunghezzaEvento,Y,3
EndIf
Next Linea
EndIf
End Select
End Statement
;--------------------------------------------
;questa procedura disegna un evento musicale
;this procedure draws a musical events
;--------------------------------------
Statement DisegnaUnEventoMusicale{TipoDiEvento$,Evento.b,InizioEvento.l,DurataEvento.l,CanaleEvento.b,ModoDisegno.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaInvisibileDelleNote
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Select TipoDiEvento$
Case "Note"
NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
I.w=16+InizioNota/ScalaNote-XInizioAreaVisibile
F.w=16+FineNota/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
InizioNotaVisibile.b=True
Else
InizioNotaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
FineNotaVisibile.b=True
Else
FineNotaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
NotaVisibile.b=True
Else
If InizioNotaVisibile=True OR FineNotaVisibile=True
NotaVisibile=True
Else
NotaVisibile=False
EndIf
EndIf
If NotaVisibile=True
X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,16-CanaleEvento
If ModoDisegno=#EventoSelezionato
Wline X0Nota,NotaVisualizzata,X1Nota,NotaVisualizzata+7,CanaleEvento-1
Wline X0Nota,NotaVisualizzata+7,X1Nota,NotaVisualizzata,CanaleEvento-1
EndIf
If ModoDisegno=#EventoNonSelezionato
Wline X0Nota+1,NotaVisualizzata+1,X1Nota-1,NotaVisualizzata+1,CanaleEvento-1
Wline X0Nota+1,NotaVisualizzata+6,X1Nota-1,NotaVisualizzata+6,CanaleEvento-1
EndIf
EndIf
If ModoDisegno=#EventoNonSelezionato
If InizioNotaVisibile=True
Wline I+1,NotaVisualizzata+1,I+1,NotaVisualizzata+6,CanaleEvento-1
EndIf
If FineNotaVisibile=True
Wline F-1,NotaVisualizzata+1,F-1,NotaVisualizzata+6,CanaleEvento-1
EndIf
EndIf
EndIf
Case "Program"
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento
Y.w=AreaVisibileDeiValori*(127-Evento)/128
WLocate I,Y
Format "000":Print "Program",Evento:Format ""
If ModoDisegno=#EventoSelezionato Then Print "X"
EndIf
Case "Control"
I.w=16+InizioEvento/ScalaNote-XInizioAreaVisibile
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento
Y.w=AreaVisibileDeiValori*(127-Evento)/128
WLocate I,Y
Format "000":Print "Control",Evento:Format ""
If ModoDisegno=#EventoSelezionato Then Print "X"
EndIf
End Select
End Statement
;-----------------------------------------------------------
;questa procedura disegna le note di sfondo con i loro nomi
;this procedure draws the notes background with note names
;----------------------------------------------------------
Statement MostraLeNoteDiSfondoConILoroNomi{}
SHARED AreaInvisibileDelleNote
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED TipoDiNota()
SHARED YInizioAreaVisibile
For Tasto.b=0 To 127-AreaInvisibileDelleNote
Nota.b=127-Tasto-YInizioAreaVisibile
Y0Nota.w=Tasto*8:Y1Nota.w=Y0Nota+7
If TipoDiNota(Nota)\Diesis=True
WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,0
WColour 3,0
Else
WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,3
WColour 0,3
EndIf
WLocate 16,Y0Nota
Print "Note ",Nota,">"
Print TipoDiNota(Nota)\NomeInglese
Print "-"
Print TipoDiNota(Nota)\NomeItaliano
Print TipoDiNota(Nota)\Ottava
Next Tasto
End Statement
;-----------------------------------------------
;questa procedura mostra i numeri delle battute
;this procedure shows the bar numbers
;-------------------------------------
Statement MostraLeBattute{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Nota.b=127-YInizioAreaVisibile-(127-AreaInvisibileDelleNote)
Nota$=Str$(Nota):OttavaNota$=Str$(TipoDiNota(Nota)\Ottava):NomeIngleseNota$=TipoDiNota(Nota)\NomeInglese
NomeItalianoNota$=TipoDiNota(Nota)\NomeItaliano
LarghezzaTesto.w=Len("Note "+Nota$+">"+NomeIngleseNota$+"-"+NomeItalianoNota$+OttavaNota$+" ")*8
If TipoDiNota(Nota)\Diesis=True Then WColour 3,0 Else WColour 0,3
BattutaVisibile.w=192*Max(ScalaNote,4)/4
ScostamentoBattute.w=XInizioAreaVisibile MOD 192
FineTempoVisibile.l=XInizioAreaVisibile+(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaNote
For TempoVisibile.l=XInizioAreaVisibile To FineTempoVisibile Step BattutaVisibile
XTempo.w=(TempoVisibile-XInizioAreaVisibile-ScostamentoBattute)/ScalaNote
If XTempo>LarghezzaTesto
WLocate XTempo,(127-AreaInvisibileDelleNote)*8:ConvertiIlTempoInBattute{TempoVisibile-ScostamentoBattute,False}
EndIf
Next TempoVisibile
End Statement
;-----------------------------------------------------
;questa procedura mostra gli slider dell'editore note
;this procedure shows the notes editor' sliders
;-----------------------------------------------
Statement MostraSliderEditoreSequenza{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED DurataSequenza
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
MostraSlider{1,YInizioAreaVisibile,AreaInvisibileDelleNote,"VERTICAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
AreaInvisibileDelTempo=DurataSequenza/ScalaNote-(LarghezzaInternaFinestraEditoreSequenza-16)
AreaInvisibileDelTempo=Max(AreaInvisibileDelTempo,0)
If AreaInvisibileDelTempo=0
Disable #ListaGadgetEditoreSequenza,2
XInizioAreaVisibile=0
Else
Enable #ListaGadgetEditoreSequenza,2
EndIf
Redraw #FinestraEditoreSequenza,2
MostraSlider{2,XInizioAreaVisibile,AreaInvisibileDelTempo,"HORIZONTAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
End Statement
;--------------------------------------------
;questa procedura mostra gli eventi musicali
;this procedure shows musical events
;------------------------------------
Statement MostraGliEventiMusicali{}
SHARED FineNotaCorrente
SHARED EventoMusicale()
SHARED NotaCorrente
SHARED SequenzaSelezionata
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
TipoDiEvento$=EventoMusicale()\Tipo
If EventoMusicale()\Sequenza=SequenzaSelezionata
InizioEvento.l=EventoMusicale()\Inizio
CanaleEvento.b=EventoMusicale()\Canale
If EventoMusicale()\Selezionato=True
Select TipoDiEvento$
Case "Note"
Nota.b=EventoMusicale()\Evento:DurataNota.l=EventoMusicale()\Durata
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoSelezionato}
Case "Program"
Programma.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,#EventoSelezionato}
Case "Control"
Controllo.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,#EventoSelezionato}
End Select
Else
Select TipoDiEvento$
Case "Note"
Nota=EventoMusicale()\Evento:DurataNota=EventoMusicale()\Durata
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoNonSelezionato}
Case "Program"
Programma.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
Case "Control"
Controllo.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,#EventoNonSelezionato}
End Select
EndIf
EndIf
Wend
End Statement
;---------------------------------------------------------------
;questa procedura mostra la scala di visualizzazione delle note
;this procedure shows the note scale of notes displaying
;--------------------------------------------------------
Statement MostraLaScalaDelleNote{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED ScalaNote
; For Scatola.b=0 To 4
; Y0Scatola.w=AltezzaInternaFinestraEditoreSequenza-8-8
; WBox Scatola,Y0Scatola+Scatola,15-Scatola,Y0Scatola+7-Scatola,15-Scatola
; Next Scatola
Select ScalaNote
Case 1
Ingrandimento.b=1
Case 2
Ingrandimento=2
Case 4
Ingrandimento=3
Case 8
Ingrandimento=4
Case 16
Ingrandimento=5
Case 32
Ingrandimento=6
End Select
WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
WColour 2,1:Print "Z",Ingrandimento
End Statement
;---------------------------------------------------
;questa procedura permette di cambiare la nota base
;this procedure permits to change the basic note
;------------------------------------------------
Statement CambiaLaNotaDiBase{}
SHARED AltezzaFonte
SHARED LarghezzaNota
SHARED TastoCursoreDestra$
SHARED TastoCursoreSinistra$
SHARED TastoEsc$
SHARED XLunSlider
SHARED YLunSlider
TipoFinestra.l=#FinestraMovibile+#GadgetNascondiFinestra+#GadgetChiudiFinestra+#DammiZeroZero+#FinestraAttivata
YPosF.w=(AltezzaFonte+3)*2
YLunF.w=AltezzaFonte+3+16+8+8+2
Window #FinestraCambioNotaBase,4,YPosF,4+24*9+2,YLunF,TipoFinestra,"Basic note",-1,-1
LarghezzaInternaFinestraCambioNotaBase.w=InnerWidth
AltezzaInternaFinestraCambioNotaBase.w=InnerHeight
CloseWindow #FinestraCambioNotaBase
XLunSlider=LarghezzaInternaFinestraCambioNotaBase
YLunSlider=8
ImpostaSlider{1,0,AltezzaInternaFinestraCambioNotaBase-8,"HORIZONTAL",0,#ListaGadgetCambioNotaBase}
Window #FinestraCambioNotaBase,4,YPosF,4+24*9+2,YLunF,TipoFinestra,"Basic note",-1,-1,#ListaGadgetCambioNotaBase
WindowFont #FonteDiCaratteriTopaz8
; Zona.b=NewZoneTable(#TabellaZoneCambioNotaBase,9)
; If Zona=True Then UseZoneTable #TabellaZoneCambioNotaBase Else Statement Return
; UseZoneTable #TabellaZoneEditoreSequenza
For Zona.b=0 To 7
WBlit Zona,24*Zona,0;:SetZone Zona,24*Zona,0,24*Zona+23,15
Next
WLocate 24*8+8,4:WColour 1,0:Print "3";:SetZone 8,24*8,0,24*8+23,15
MostraSlider{1,(LarghezzaNota-6)/6,((192*6)-6)/6,"HORIZONTAL",#ListaGadgetCambioNotaBase,#FinestraCambioNotaBase}
Repeat
WLocate 0,AltezzaInternaFinestraCambioNotaBase-8-8
If LarghezzaNota MOD 6=0 Then WColour 10,9 Else WColour 2,1
Format "0000":Print LarghezzaNota:Format "":Print SPACE$(23)
EventoFinestraCambioNotaBase.l=WaitEvent
Select EventoFinestraCambioNotaBase
Case #HaiPremutoUnTastoDelTopo
XTopo.w=WMouseX:YTopo.w=WMouseY:TastoCliccatoDelTopo.b=MButtons
Select TastoCliccatoDelTopo
Case 1
XZonaTopo.b=XTopo/24:YZonaTopo.b=YTopo>=0 AND YTopo<16
If YZonaTopo=True
Select XZonaTopo
Case 0
LarghezzaNota=192*4:NotaPuntata.w=0:Terzina.b=0
Speak "You have choosen a whole note width."
Case 1
LarghezzaNota=192*2:NotaPuntata=0:Terzina=0
Speak "You have choosen a half note width."
Case 2
LarghezzaNota=192:NotaPuntata=0:Terzina=0
Speak "You have choosen a quarter note width."
Case 3
LarghezzaNota=192/2:NotaPuntata=0:Terzina=0
Speak "You have choosen an eighth note width."
Case 4
LarghezzaNota=192/4:NotaPuntata=0:Terzina=0
Speak "You have choosen a sixteenth note width."
Case 5
LarghezzaNota=192/8:NotaPuntata=0:Terzina=0
Speak "You have choosen a thirty second note width."
Case 6
LarghezzaNota=192/16:NotaPuntata=0:Terzina=0
Speak "You have choosen a sixty fourth note width."
Case 7
If NotaPuntata=0
NotaPuntata=LarghezzaNota/2
LarghezzaNota+NotaPuntata
If Terzina>0
Terzina=0
Speak "You have no more a triplet note width, you have a dotted note width."
Else
Speak "You have a dotted note width."
EndIf
Else
LarghezzaNota/3*2
NotaPuntata=0
Speak "You have no more a dotted note width."
EndIf
Case 8
If Terzina=0
Terzina=3:LarghezzaNota/Terzina
If NotaPuntata>0
NotaPuntata=0
Speak "You have no more a dotted note width, you have a triplet note width."
Else
Speak "You have a triplet note width."
EndIf
Else
LarghezzaNota*Terzina:Terzina=0
Speak "You have no more a triplet note width."
EndIf
End Select
EndIf
Case 5
End Select
; Case #HaiPremutoUnGadget
; XLunSlider=LarghezzaInternaFinestraCambioNotaBase
; LarghezzaNota=ValoreSlider{1,((192*6)-6)/6,XLunSlider,"HORIZONTAL",#ListaGadgetCambioNotaBase}*#_MClksPerSP+#_MClksPerSP
Case #HaiRilasciatoUnGadget
XLunSlider=LarghezzaInternaFinestraCambioNotaBase
LarghezzaNota=ValoreSlider{1,((192*6)-6)/6,XLunSlider,"HORIZONTAL",#ListaGadgetCambioNotaBase}*#_MClksPerSP+#_MClksPerSP
NotaPuntata=0:Terzina=0
Case #HaiChiusoLaFinestra
EsciDalCambioNotaBase=True
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
Select TastoPremuto$
Case TastoEsc$
EsciDalCambioNotaBase=True
Case TastoCursoreDestra$
If LarghezzaNota<192*6-1 Then LarghezzaNota+2:NotaPuntata=0:Terzina=0
Case TastoCursoreSinistra$
If LarghezzaNota>7 Then LarghezzaNota-2:NotaPuntata=0:Terzina=0
End Select
End Select
Until EsciDalCambioNotaBase=True
;*************************************************************
;la seguente linea se attivata da' errore quando non dovrebbe
;the following line if avtivated gives an error when it should not do
;*********************************************************************
; FreeZoneTable(#TabellaZoneCambioNotaBase)
CloseWindow #FinestraCambioNotaBase
Use Window #FinestraEditoreSequenza
;***************************************************
;il seguente comando sembra non avere alcun effetto
;the following command seems have no effect
;*******************************************
; UseZoneTable #TabellaZoneEditoreSequenza
End Statement
;---------------------------------------------------------------------------
;questa procedura permette di spostare le nota selezionate cliccando con il
; mouse su una di esse
;this procedure permits to move the selected notes clicking on one of these
;---------------------------------------------------------------------------
Statement MuoviGliEventiSelezionatiConIlTopo{XPosizioneEvento.l,YPosizioneEvento.b}
SHARED AreaInvisibileDelleNote
SHARED AreaVisibileDeiValori
SHARED EventoMusicale()
SHARED LarghezzaNota
SHARED ScalaNote
SHARED XInizioAreaVisibile
SHARED XPosizioneNota
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
TastoPremutoDelTopo.b=Joyb(0)
If TastoPremutoDelTopo=#TastoSinistroDelTopoPremuto
NuovaXTopo.w=WMouseX:NuovaYTopo.w=WMouseY
TipoDiEvento$=EventoMusicale()\Tipo
InizioEvento.l=EventoMusicale()\Inizio
CanaleEvento.b=EventoMusicale()\Canale
Select TipoDiEvento$
Case "Note"
XNuovaPosizioneNota.l=(XInizioAreaVisibile+(NuovaXTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
YNuovaPosizioneNota.b=127-YInizioAreaVisibile-NuovaYTopo/8
If XNuovaPosizioneNota<>XPosizioneEvento
DeltaXEventoMusicale.l=XNuovaPosizioneNota-XPosizioneNota
EventoMusicaleSpostatoConIlTopo=True
Else
DeltaXEventoMusicale=0
EndIf
If YNuovaPosizioneNota<>YPosizioneEvento
DeltaYEventoMusicale.b=YNuovaPosizioneNota-YPosizioneNota
EventoMusicaleSpostatoConIlTopo=True
Else
DeltaYEventoMusicale=0
EndIf
If DeltaXEventoMusicale=0 AND DeltaYEventoMusicale=0 Then EventoMusicaleSpostatoConIlTopo=False
If EventoMusicaleSpostatoConIlTopo=True
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True
If TipoDiEvento$="Note"
Nota.b=EventoMusicale()\Evento
If Nota+DeltaYEventoMusicale>=0 AND Nota+DeltaYEventoMusicale<=127 Then EventoMusicale()\Evento+DeltaYEventoMusicale
InizioEvento.l=EventoMusicale()\Inizio
If InizioEvento+DeltaXEventoMusicale>=0 Then EventoMusicale()\Inizio+DeltaXEventoMusicale
EndIf
EndIf
Wend
PopItem EventoMusicale()
EndIf
Case "Program"
XNuovaPosizioneProgramma.l=(XInizioAreaVisibile+(NuovaXTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
YNuovaPosizioneProgramma.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If XNuovaPosizioneProgramma<>XPosizioneEvento
DeltaXEventoMusicale.l=XNuovaPosizioneProgramma-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
DeltaXEventoMusicale=0
EndIf
If YNuovaPosizioneProgramma<>YPosizioneEvento
DeltaYEventoMusicale.b=YNuovaPosizione-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
DeltaYEventoMusicale=0
EndIf
If DeltaXEventoMusicale=0 AND DeltaYEventoMusicale=0 Then EventoMusicaleSpostatoConIlTopo=False
If EventoMusicaleSpostatoConIlTopo=True
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True
If TipoDiEvento$="Program"
Programma.b=EventoMusicale()\Evento
If Programma+DeltaYEventoMuiscale>=0 AND Programma+DeltaYEventoMusicale<AreaVisibileDeiValori
EventoMusicale()\Evento+DeltaYEventoMusicale
EndIf
InizioEvento.l=EventoMusicale()\Inizio
If InizioEvento+DeltaXEventoMusicale>=0 Then EventoMusicale()\Inizio+DeltaXEventoMusicale
EndIf
EndIf
Wend
PopItem EventoMusicale()
EndIf
Case "Control"
XNuovaPosizioneControllo.l=(XInizioAreaVisibile+(NuovaXTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
YNuovaPosizioneControllo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If XNuovaPosizioneControllo<>XPosizioneEvento
DeltaXEventoMusicale.l=XNuovaPosizioneControllo-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
DeltaXEventoMusicale=0
EndIf
If YNuovaPosizioneControllo<>YPosizioneEvento
DeltaYEventoMusicale.b=YNuovaPosizioneControllo-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
DeltaYEventoMusicale=0
EndIf
If DeltaXEventoMusicale=0 AND DeltaYEventoMusicale=0 Then EventoMusicaleSpostatoConIlTopo=False
If EventoMusicaleSpostatoConIlTopo=True
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True
If TipoDiEvento$="Control"
Conttrollo.b=EventoMusicale()\Evento
If Controllo+DeltaYEventoMuiscale>=0 AND Controllo+DeltaYEventoMusicale<AreaVisibileDeiValori
EventoMusicale()\Evento+DeltaYEventoMusicale
EndIf
InizioEvento.l=EventoMusicale()\Inizio
If InizioEvento+DeltaXEventoMusicale>=0 Then EventoMusicale()\Inizio+DeltaXEventoMusicale
EndIf
EndIf
Wend
PopItem EventoMusicale()
EndIf
End Select
EndIf
End Statement
;----------------------------------------
;questa procedura suona la nota corrente
;this procedure plays the current note
;--------------------------------------
Statement SuonaLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED EventoMusicale()
SHARED MIDIAttivato
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
For Suono.b=0 To 31
If Suono(Suono)\Canale=CanaleNota Pop For:Goto FineCicloFor
Next Suono
FineCicloFor
If Suono<32
If Suono(Suono)\Canale>0
Periodo.l=PeriFreq(Nota)\Periodo
If Periodo>=#PeriodoMinimo AND Periodo<65536
If VoceSpenta>0
If VoceSpenta BitTst 0=True Then Voce.b=1:VoceSpenta BitClr 0:Goto SuonaCampione
If VoceSpenta BitTst 1=True Then Voce=2:VoceSpenta BitClr 1:Goto SuonaCampione
If VoceSpenta BitTst 2=True Then Voce=4:VoceSpenta BitClr 2:Goto SuonaCampione
If VoceSpenta BitTst 3=True Then Voce=8:VoceSPenta BitClr 3
EndIf
SuonaCampione
SetPeriod Suono,Periodo:Sound Suono,Voce
EventoMusicale()\VoceUsata=Voce
Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
EndIf
EndIf
Else
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_NoteOn+(CanaleNota-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Nota
WriteSerial 0,VelocitaNota
Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
EndIf
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleNota-1,16-CanaleNota
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue il cambio di programma
;this procedure execute the program change
;------------------------------------------
Statement EseguiIlCambioDiProgramma{Programma,CanaleProgramma.b,Modo.b}
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ProgramChange+(CanaleProgramma-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Programma
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Program>"+Str$(Programma)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleProgramma-1,16-CanaleProgramma
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue il cambio di controllo
;this procedure execute the control change
;------------------------------------------
Statement EseguiIlCambioDiControllo{Controllo,ValoreControllo,CanaleControllo.b,Modo.b}
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ControlChange+(CanaleControllo-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Controllo
WriteSerial 0,ValoreControllo
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Control>"+Str$(Controllo)+" val>"+Str$(ValoreControllo)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleControllo-1,16-CanaleControllo
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------------
;questa procedura interrompe la nota suonata corrente
;this procedure stops the current played note
;---------------------------------------------
Statement SmettiDiSuonareLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED EventoMusicale()
SHARED MIDIAttivato
SHARED VoceSpenta
VoceUsata.b=EventoMusicale()\VoceUsata
If VoceUsata>0
Quiet VoceUsata
VoceSpenta OR VoceUsata
Else
If MIDIAttivato=True
ByteDiStatoMIDI=#_NoteOff+(CanaleNota-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Nota
WriteSerial 0,VelocitaNota
EndIf
EndIf
End Statement
;----------------------------------
;questa procedura modifica le note
;this procedure modifies the notes
;----------------------------------
Statement Selezione{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaInvisibileDelleNote
SHARED AreaVisibileDeiValori
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED Eventi
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaNota
SHARED MIDIAttivato
SHARED NotaSuonata
SHARED PeriFreq()
SHARED ScalaNote
SHARED SequenzaSelezionata
SHARED Suono()
SHARED TipoDiEvento$
SHARED XInizioAreaVisibile
SHARED XPosizioneNota
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
SHARED YTopo
ResetList EventoMusicale()
StessoEvento.b=%0000
XTopo=Min(Max(XTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
While NextItem(EventoMusicale())=True
StessoEvento=%0000
TipoDiEventoSelezionato$=EventoMusicale()\Tipo
InizioEvento.l=EventoMusicale()\Inizio
CanaleEvento.b=EventoMusicale()\Canale
SequenzaEvento.w=EventoMusicale()\Sequenza
EventoSelezionato.b=EventoMusicale()\Selezionato
If Modo=#SelezionaUnEvento
Select TipoDiEventoSelezionato$
Case "Note"
Nota.b=EventoMusicale()\Evento
DurataNota.l=EventoMusicale()\Durata
FineNota.l=InizioEvento+DurataNota-1
VelocitaNota.b=EventoMusicale()\Valore
XPosizioneNota=(XInizioAreaVisibile+(XTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
YPosizioneNota=127-YInizioAreaVisibile-YTopo/8
If XPosizioneNota>=InizioEvento Then StessoEvento OR %0001
If XPosizioneNota<=FineNota Then StessoEvento OR %0010
If YPosizioneNota=Nota Then StessoEvento OR %0100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %1000
If StessoEvento=%1111
If CanaleSelezionato<>CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneNota,YPosizioneNota}
Nota=EventoMusicale()\Evento
VelocitaNota=EventoMusicale()\Valore
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Else
NotaPiuLunga.l=DurataNota
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
SuonaLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Inizio=InizioNota,CanaleNota
NotaSuonata\Eseguito=True
NotaSuonata\Evento=Nota,DurataNota,VelocitaNota
Pop While:Goto FineCicloWhile
EndIf
Case "Program"
Programma.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Program000")*8-1
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
FineProgramma.w=InizioEvento+LunghezzaEvento
XPosizioneProgramma.w=(XInizioAreaVisibile+(XTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
YPosizioneProgramma.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneProgramma>=InizioEvento Then StessoEvento OR %0001
If XPosizioneProgramma<FineProgramma Then StessoEvento OR %0010
If YPosizioneProgramma=Programma Then StessoEvento OR %0100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %1000
If StessoEvento=%1111
If CanaleSelezionato<>CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneProgramma,YPosizioneProgramma}
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Else
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Pop While:Goto FineCicloWhile
EndIf
Case "Control"
Controllo.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Program000")*8-1
If EventoSelezionato=True Then LunghezzaEvento+Len("X")*8
FineControllo.w=InizioEvento+LunghezzaEvento
XPosizioneControllo.w=(XInizioAreaVisibile+(XTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
YPosizioneControllo.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneControllo>=InizioEvento Then StessoEvento OR %0001
If XPosizioneControllo<FineControllo Then StessoEvento OR %0010
If YPosizioneControllo=Controllo Then StessoEvento OR %0100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento OR %1000
If StessoEvento=%1111
If CanaleSelezionato<>CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
EndIf
If EventoSelezionato=True
MuoviGliEventiSelezionatiConIlTopo{XPosizioneControllo,YPosizioneControllo}
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Else
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Pop While:Goto FineCicloWhile
EndIf
End Select
Else
If EventoSelezionato=True
Select Modo
Case #CambiaIlCanaleDegliEventiSelezionati
EventoMusicale()\Canale=CanaleSelezionato
Case #AlzaDiUnoGliEventiSelezionati
If EventoMusicale()\Evento<127 Then EventoMusicale()\Evento+1
Case #AbbassaDiUnoGliEventiSelezionati
If EventoMusicale()\Evento>0 Then EventoMusicale()\Evento-1
Case #SpostaAvantiNelTempoGliEventiSelezionati
EventoMusicale()\Inizio+LarghezzaNota
DurataSequenza=Max(EventoMusicale()\Inizio+EventoMusicale()\Durata-1,DurataSequenza)
Case #SpostaIndietroNelTempoGliEventiSelezionati
EventoMusicale()\Inizio-LarghezzaNota:If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
Case #EliminaGliEventiSelezionati
If Eventi>0
Eventi-1:EventiSelezionati-1:KillItem EventoMusicale()
EndIf
Case #DeselezionaTuttiGliEventi
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Case #InvertiLaSelezioneDiTuttiGliEventi
EventiSelezionati-1
EventoMusicale()\Selezionato=False
Case #AggiungiDieciAgliEventiSelezionati
If EventoMusicale()\Evento+10<127 Then EventoMusicale()\Evento+10
Case #SottraiDieciAgliEventiSelezionati
If EventoMusicale()\Evento-10>=0 Then EventoMusicale()\Evento-10
End Select
If TipoDiEventoSelezionato$="Note"
Select Modo
Case #AllungaLaDurataDelleNoteSelezionate
If DurataNota=6 Then EventoMusicale()\Durata=LarghezzaNota Else EventoMusicale()\Durata+LarghezzaNota
NotaPiuLunga=Max(NotaPiuLunga,EventoMusicale()\Durata)
DurataSequenza=Max(EventoMusicale()\Inizio+EventoMusicale()\Durata-1,DurataSequenza)
Case #RiduciLaDurataDelleNoteSelezionate
EventoMusicale()\Durata-LarghezzaNota:If EventoMusicale()\Durata<#_MClksPerSP Then EventoMusicale()\Durata=#_MClksPerSP
NotaPiuLunga=Max(EventoMusicale()\Durata,NotaPiuLunga)
Case #AlzaDiUnOttavaLeNoteSelezionate
If EventoMusicale()\Evento+12<=127 Then EventoMusicale()\Evento+12
Case #AbbassaDiUnOttavaLeNoteSelezionate
If EventoMusicale()\Evento-12>=0 Then EventoMusicale()\Evento-12
End Select
EndIf
Else
Select Modo
Case #SelezionaTuttiGliEventi
EventiSelezionati+1
EventoMusicale()\Selezionato=True
Case #InvertiLaSelezioneDiTuttiGliEventi
EventiSelezionati+1
EventoMusicale()\Selezionato=True
End Select
EndIf
EndIf
Wend
FineCicloWhile
If Modo=#SelezionaUnEvento AND StessoEvento<%1111
If CanaleSelezionato>0
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
Eventi+1
EventoMusicale()\Inizio=(XInizioAreaVisibile+(XTopo-16)*ScalaNote)/LarghezzaNota*LarghezzaNota
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Selezionato=False
EventoMusicale()\Tipo=TipoDiEvento$
Select TipoDiEvento$
Case "Note"
EventoMusicale()\Evento=127-YInizioAreaVisibile-YTopo/8
EventoMusicale()\Durata=LarghezzaNota
EventoMusicale()\Valore=64
NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Inizio,EventoMusicale()\Canale,EventoMusicale()\Sequenza
NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Eseguito=True
Case "Program"
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
Case "Control"
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Valore=64
End Select
DurataSequenza=Max(EventoMusicale()\Inizio+EventoMusicale()\Durata,DurataSequenza)
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
EndIf
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
EndIf
If Modo=#SelezionaGliEventiUguali
ResetList EventoMusicale():If EventiSelezionati>0 Then EventiSelezionati-1
Nota.b=127-YInizioAreaVisibile-YTopo/8
While NextItem(EventoMusicale())=True
If EventoMusicale()\Canale=CanaleSelezionato AND EventoMusicale()\Sequenza=SequenzaSelezionata
Select TipoDiEvento$
Case "Note"
If EventoMusicale()\Evento=Nota
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Case "Program"
If EventoMusicale()\Evento=Programma
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
Case "Control"
If EventoMusicale()\Evento=Controllo
EventiSelezionati+1
EventoMusicale()\Selezionato=True
EndIf
End Select
EndIf
Wend
EndIf
If NotaPiuLunga>0
XMessaggio.w=16*16+8*3+8*4+8*6
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate XMessaggio,YMessaggio
WColour 1,0
Print SPACE$(80-XMessaggio/8)
WLocate XMessaggio,YMessaggio
Print "Len>":ConvertiIlTempoInBattute{NotaPiuLunga,True}
EndIf
End Statement
;-----------------------------------------------
;questa procedura si occupa eseguire gli eventi
;this procedure executes the events
;-----------------------------------
Statement EseguiGliEventi{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED FineMotivo
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TicPerCinquantesimoDiSecondo
ResetTimer
Tempo.l=Timer
If Modo=#EseguiGliEventiDallaFinestraPrincipale Then FineEsecuzione.l=FineMotivo
If Modo=#EseguiGliEventiDallEditoreSequenza Then FineEsecuzione=DurataSequenza
Repeat
Tempo=Timer*TicPerCinquantesimoDiSecondo
EventoFinestraEsecutoreEventiMusicali.l=Event
If EventoFinestraEsecutoreEventiMusicali=#HaiChiusoLaFinestra Then Pop Repeat:Statement Return
ResetList EventoMusicale()
While NextItem(EventoMusicale())
SequenzaEvento.w=EventoMusicale()\Sequenza
If SequenzaEvento=SequenzaSelezionata OR Modo=#EseguiGliEventiDallaFinestraPrincipale
If Modo=#EseguiGliEventiDallaFinestraPrincipale
InizioEvento.l=Sequenza(SequenzaEvento)\Inizio+EventoMusicale()\Inizio
EndIf
If Modo=#EseguiGliEventiDallEditoreSequenza
InizioEvento.l=EventoMusicale()\Inizio
EndIf
EventoEseguito.b=EventoMusicale()\Eseguito
If EventoEseguito=0 AND Tempo>=InizioEvento
TipoDiEvento$=EventoMusicale()\Tipo
CanaleEvento.b=EventoMusicale()\Canale
EventoEseguito.b=EventoMusicale()\Eseguito
If TipoDiEvento$="Note"
Nota.b=EventoMusicale()\Evento
DurataNota.l=EventoMusicale()\Durata
FineEvento.l=InizioEvento+DurataNota-1
VelocitaNota.b=EventoMusicale()\Valore
SuonaLaNota{Nota,VelocitaNota,CanaleEvento,Modo}
If Modo=#EseguiGliEventiDallEditoreSequenza
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoEvidenziato}
EndIf
Else
Select TipoDiEvento$
Case "Program"
Programma.b=EventoMusicale()\Evento
EseguiIlCambioDiProgramma{Programma,CanaleEvento,Modo}
Case "Control"
Controllo.b=EventoMusicale()\Evento:ValoreEvento.b=EventoMusicale()\Valore
EseguiIlCambioDiControllo{Controllo,ValoreEvento,CanaleEvento,Modo}
End Select
FineEvento=InizioEvento
EndIf
EventoMusicale()\Eseguito=1
EndIf
If EventoEseguito=1 AND Tempo>=FineEvento
If Modo=#EseguiGliEventiDallEditoreSequenza
EventoSelezionato.b=EventoMusicale()\Selezionato
If TipoDiEvento$="Note"
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEvento,Modo}
If EventoSelezionato=True
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoSelezionato}
Else
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,#EventoNonSelezionato}
EndIf
EndIf
EndIf
EventoMusicale()\Eseguito=2
EndIf
EndIf
Wend
Until Tempo>=FineEsecuzione
ResetList EventoMusicale()
While NextItem(EventoMusicale())
EventoMusicale()\Eseguito=0
Wend
Quiet %1111
End Statement
Statement EditoreSequenza{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaSchermo
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED AreaVisibileDeiValori
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED Eventi
SHARED EventiSelezionati
SHARED EventoMusicale()
SHARED FineMotivo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaNota
SHARED LarghezzaSchermo
SHARED MIDIAttivato
SHARED NotaSuonata
SHARED PeriFreq()
SHARED ScalaNote
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoBackspace$
SHARED TastoCursoreDestra$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSinistra$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED TicPerCinquantesimoDiSecondo
SHARED TipoDiEvento$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED XLunSlider
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YLunSlider
SHARED YTopo
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
MenuTitle #ListaMenuEditoreSequenza,0,"Controls"
MenuItem #ListaMenuEditoreSequenza,0,0,0,"Play"
MenuTitle #ListaMenuEditoreSequenza,1,"Event type"
MenuItem #ListaMenuEditoreSequenza,4,1,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,1,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,1,2," Control"
MenuTitle #ListaMenuEditoreSequenza,2,"Settings"
MenuItem #ListaMenuEditoreSequenza,0,2,0,"Basic width"
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#GadgetNascondiFinestra+#GadgetChiudiFinestra+#DammiZeroZero+#FinestraAttivata
Eventi=Sequenza(SequenzaSelezionata-1)\Eventi
EventiSelezionati=Sequenza(SequenzaSelezionata-1)\EventiSelezionati
TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+"-"
If Eventi>0
TitoloFinestra$+Str$(EventiSelezionati)+"selected event"
If EventiSelezionati<>1 Then TitoloFinestra$+"s"
TitoloFinestra$+" of "+Str$(Eventi)+" event"
If Eventi<>1 Then TitoloFinestra$+"s"
Else
TitoloFinestra$+"no events into this sequence"
EndIf
Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
LarghezzaInternaFinestraEditoreSequenza=InnerWidth
AltezzaInternaFinestraEditoreSequenza=InnerHeight
CloseWindow #FinestraEditoreSequenza
AreaInvisibileDelleNote.b=128-(AltezzaInternaFinestraEditoreSequenza-8-8)/8
AreaVisibileDeiValori.w=(128-AreaInvisibileDelleNote)*8-7
XLunSlider=16
YLunSlider=AltezzaInternaFinestraEditoreSequenza-8-8
ImpostaSlider{1,0,0,"VERTICAL",0,#ListaGadgetEditoreSequenza}
XLunSlider=LarghezzaInternaFinestraEditoreSequenza-16
YLunSlider=8
ImpostaSlider{2,16,AltezzaInternaFinestraEditoreSequenza-8-8,"HORIZONTAL",0,#ListaGadgetEditoreSequenza}
Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetEditoreSequenza
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuEditoreSequenza
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #DueColoriConSfondoPieno
SetZone 0,0,0,LarghezzaInternaFinestraEditoreSequenza-1,AltezzaInternaFinestraEditoreSequenza-1-8-8
Format "00"
For Canale.b=1 To 16
X0Canale=(Canale-1)*16:Y0Canale=AltezzaInternaFinestraEditoreSequenza-8
WLocate X0Canale,Y0Canale
If Canale=CanaleSelezionato Then WColour Canale-1,16-Canale Else WColour 10+(Canale MOD 2)*2,9+(Canale MOD 2)*2
Print Canale
SetZone Canale,X0Canale,Y0Canale,X0Canale+15,Y0Canale+7
Next Canale
Format ""
WLocate X0Canale+16,Y0Canale:WColour 14,13:Print "All"
SetZone 17,X0Canale+16,Y0Canale,X0Canale+16+23,Y0Canale+7
WLocate X0Canale+16+8*3,Y0Canale:WColour 15,14:Print "None"
SetZone 18,X0Canale+16+8*3,Y0Canale,X0Canale+16+8*3+8*4-1,Y0Canale+7
WLocate X0Canale+16+8*3+8*4,Y0Canale:WColour 14,13:Print "Toggle"
SetZone 19,X0Canale+16+8*3+8*4,Y0Canale,X0Canale+16+8*3+8*4+8*6-1,Y0Canale+7
MostraLaScalaDelleNote{}
SetZone 20,0,AltezzaInternaFinestraEditoreSequenza-8-8,15,AltezzaInternaFinestraEditoreSequenza-8-8+7
InizioSequenza.l=Sequenza(SequenzaSelezionata-1)\Inizio
DurataSequenza=Max(Sequenza(SequenzaSelezionata-1)\Durata,192*4)
ResetTimer
Tempo.l=Timer
Repeat
If SecondoClicDelTopo.b=False
TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+"-"
If Eventi>0
TitoloFinestra$+Str$(EventiSelezionati)+" selected event"
If EventiSelezionati<>1 Then TitoloFinestra$+"s"
TitoloFinestra$+" of "+Str$(Eventi)+" event"
If Eventi<>1 Then TitoloFinestra$+"s"
Else
TitoloFinestra$+"no events into this sequence"
EndIf
WTitle TitoloFinestra$
MostraLeNoteDiSfondoConILoroNomi{}
MostraLeBattute{}
MostraGliEventiMusicali{}
MostraSliderEditoreSequenza{}
SecondoClicDelTopo=True
TempoClic.b=0
EndIf
If NotaSuonata\Eseguito=True
Nota.b=NotaSuonata\Evento:InizioNota.l=NotaSuonata\Inizio
FineNota.l=InizioNota+NotaSuonata\Durata-1
VelocitaNota.b=NotaSuonata\Valore
CanaleNota.b=NotaSuonata\Canale
If Tempo>FineNota
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiDallEditoreSequenza}
NotaSuonata\Eseguito=False
EndIf
EndIf
EventoFinestraEditoreSequenza.l=Event
Select EventoFinestraEditoreSequenza
Case #HaiPremutoUnTastoDelTopo
TastoCliccatoDelTopo=MButtons:TastoPremutoDelTopo=Joyb(0)
XTopo=WMouseX:YTopo=WMouseY:ZonaTopo.b=Zone(XTopo,YTopo)
Select TastoCliccatoDelTopo
Case 1
Select ZonaTopo
Case 0
Selezione{#SelezionaUnEvento}
Case 1
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=1:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 2
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=2:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 3
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=3:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 4
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=4:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 5
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=5:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSeleZionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 6
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=6:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 7
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=7:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 8
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=8:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 9
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=9:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 10
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=10:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 11
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=11:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 12
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=12:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 13
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=13:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 14
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=14:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 15
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=15:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 16
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour 10+(CanaleSelezionato MOD 2)*2,9+CanaleSelezionato MOD 2*2:Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=16:Selezione{#CambiaIlCanaleDegliEventiSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 17
Selezione{#SelezionaTuttiGliEventi}
NoteSelezionate=Note
Case 18
Selezione{#DeselezionaTuttiGliEventi}
NoteSelezionate=0
Case 19
Selezione{#InvertiLaSelezioneDiTuttiGliEventi}
Case 20
ScalaNote+ScalaNote
If ScalaNote=64 Then ScalaNote=1
AreaInvisibileDelTempo=(DurataSequenza-LarghezzaInternaFinestraEditoreSequenza-16)/ScalaNote
MostraLaScalaDelleNote{}
MostraSliderEditoreSequenza{}
End Select
SecondoClicDelTopo=False
TempoClic=0
Case 5
If TempoClic>35 AND ZonaTopo=0
Selezione{#SelezionaGliEventiUguali}
SecondoClicDelTopo=False
Else
SecondoClicDelTopo=True
TempoClic=0
EndIf
End Select
; Case #HaiPremutoUnGadget
; Select GadgetHit
; Case 1
; LunghezzaSlider=AltezzaInternaFinestraEditoreSequenza-8-8
; YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,LunghezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
; Case 2
; LunghezzaSlider=LarghezzaInternaFinestraEditoreSequenza-16
; XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
; End Select
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
LunghezzaSlider=AltezzaInternaFinestraEditoreSequenza-8-8
YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,LunghezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
Case 2
LunghezzaSlider=LarghezzaInternaFinestraEditoreSequenza-16
XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
End Select
SecondoClicDelTopo=False
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=0 Then EseguiGliEventi{#EseguiGliEventiDallEditoreSequenza}
If MenuHit=1 AND ItemHit=0 Then TipoDiEvento$="Note"
If MenuHit=1 AND ItemHit=1 Then TipoDiEvento$="Program"
If MenuHit=1 AND ItemHit=2 Then TipoDiEvento$="Control"
If MenuHit=2 AND ItemHit=0 Then CambiaLaNotaDiBase{}
SecondoClicDelTopo=False
Case #HaiChiusoLaFinestra
EsciDallEditoreSequenza.b=True
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
If TastoPremuto$=TastoEsc$ Then EsciDallEditoreSequenza=True
If EventiSelezionati>0
TastiShiftPremuti.b=(Qualifier-$8000) AND %11
If TastiShiftPremuti>0
Select TastoPremuto$
Case TastoBackspace$
Selezione{#EliminaGliEventiSelezionati}
Case TastoCursoreSu$
If TipoDiEvento$="Note" Then Selezione{#AlzaDiUnOttavaLeNoteSelezionate}
If TipoDiEvento$="Program" Then Selezione{#AggiungiDieciAgliEventiSelezionati}
If TipoDiEvento$="Control" Then Selezione{#AggiungiDieciAgliEventiSelezionati}
Case TastoCursoreGiu$
If TipoDiEvento$="Note" Then Selezione{#AbbassaDiUnOttavaLeNoteSelezionate}
If TipoDiEvento$="Program" Then Selezione{#SottraiDieciAgliEventiSelezionati}
If TipoDiEvento$="Control" Then Selezione{#SottraiDieciAgliEventiSelezionati}
Case TastoCursoreDestra$
If TipoDiEvento$="Note" Then Selezione{#AllungaLaDurataDelleNoteSelezionate}
Case TastoCursoreSinistra$
If TipoDiEvento$="Note" Then Selezione{#RiduciLaDurataDelleNoteSelezionate}
End Select
Else
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
KillItem EventoMusicale():Eventi-1
EndIf
Case TastoCursoreSu$
Selezione{#AlzaDiUnoGliEventiSelezionati}
Case TastoCursoreGiu$
Selezione{#AbbassaDiUnoGliEventiSelezionati}
Case TastoCursoreDestra$
Selezione{#SpostaAvantiNelTempoGliEventiSelezionati}
Case TastoCursoreSinistra$
Selezione{#SpostaIndietroNelTempoGliEventiSelezionati}
End Select
EndIf
Else
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Selezionato=True Then EventiSelezionati-1
KillItem EventoMusicale():Eventi-1
EndIf
Case TastoCursoreSu$
If YInizioAreaVisibile>0 Then YInizioAreaVisibile-1
Case TastoCursoreGiu$
If YInizioAreaVisibile<AreaInvisibileDelleNote Then YInizioAreaVisibile+1
Case TastoCursoreDestra$
XInizioAreaVisibile+LarghezzaNota
XInizioAreaVisibile=Min(XInizioAreaVisibile,AreaInvisibileDelTempo)
Case TastoCursoreSinistra$
XInizioAreaVisibile-LarghezzaNota
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
End Select
EndIf
SecondoClicDelTopo=False
End Select
Tempo=Timer*TicPerCinquantesimoDiSecondo
TempoClic+1
Until EsciDallEditoreSequenza=True
Sequenza(SequenzaSelezionata-1)\Eventi=Eventi
Sequenza(SequenzaSelezionata-1)\EventiSelezionati=EventiSelezionati
Sequenza(SequenzaSelezionata-1)\Inizio=InizioSequenza
Sequenza(SequenzaSelezionata-1)\Durata=DurataSequenza
FineMotivo=Max(InizioSequenza+DurataSequenza,FineMotivo)
CloseWindow #FinestraEditoreSequenza
Use Window #FinestraPrincipale
WJam #UnColoreConSfondoTrasparente
End Statement
;--------------------------------------------------------------
;questa procedura mostra le sequenze nella finestra principale
;this procedure show the sequences in the main window
;-----------------------------------------------------
Statement MostraLeSequenze{}
SHARED PrimaSequenzaDaVisualizzare
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED SequenzeVisibili
For Sequenza.b=1 To SequenzeVisibili
WLocate 16,Sequenza*8:WColour 0,0:Print SPACE$(78):WLocate 16,Sequenza*8
NomeSequenza$=Sequenza(PrimaSequenzaDaVisualizzare+Sequenza-1)\Nome
EventiSequenza.l=Sequenza(PrimaSequenzaDaVisualizzare+Sequenza-1)\Eventi
If SequenzaSelezionata>0 AND PrimaSequenzaDaVisualizzare+Sequenza=SequenzaSelezionata
If NoteSequenza>0 Then WColour 3 Else WColour 2
Format "000":Print PrimaSequenzaDaVisualizzare+Sequenza:Format "":Print "->"
Else
If NoteSequenza>0 Then WColour 2 Else WColour 1
Format "000":Print PrimaSequenzaDaVisualizzare+Sequenza:Format "":Print "->"
EndIf
If EventiSequenza>0
Print EventiSequenza," event":If EventiSequenza>1 Then Print "s"
Print " into sequence, "
Else
Print "empty sequence, "
EndIf
If NomeSequenza$<>""
Print NomeSequenza$
Else
Print "unnamed"
EndIf
Next Sequenza
End Statement
Statement MostraIlTempo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED BattuteAlMinuto
SHARED TicPerCinquantesimoDiSecondo
WLocate 0,AltezzaSchermo-(AltezzaFonte+3)-8-8
WColour 3:Print "BPM>",BattuteAlMinuto," Ticks/50th>",TicPerCinquantesimoDiSecondo
End Statement
;----------------------------------------------------
;questo programma puo' essere lanciato dal Workbench
;this program can be launched from Workbench
;_-------------------------------------------
WBStartup
CaricaLaFonteDiCaratteriTopaz8{}
ImpostaIlParlatoDellAmiga{}
CaricaLeImmaginiDelleNote{}
CaricaLaBitmapDiSfondo{}
ImpostaLoSchermo{}
CaricaLaStoriaDeiProgettiAperti{}
ImpostaLaFinestraPrincipale{}
CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
AttivaMIDI{}
Sequenze.w=0
SequenzaSelezionata.w=0
VoceSpenta=%1111
;-----------------
;clclo principale
;main loop
;----------
Repeat
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
MostraLeSequenze{}
MostraGliEventiMusicaliDisponibili{}
MostraIlTempo{}
Redraw #FinestraPrincipale
;--------------------------------------------------------------
;questa variabile cattura gli eventi della finestra principale
;this variable catch main window events
;---------------------------------------
EventoFinestraPrincipale.l=WaitEvent
Select EventoFinestraPrincipale
;------------------------------------
;se avete premuto un tasto del mouse
;if you have prssed a mouse button
;----------------------------------
Case #HaiPremutoUnTastoDelTopo
YTopo=WMouseY:TastoCliccatoDelTopo.b=MButtons:TastoPremutoDelTopo.b=Joyb(1)
If TastoCliccatoDelTopo=1
If YTopo>=8 AND Ytopo<8+(SequenzeVisibili-1)*8
SequenzaSelezionata=PrimaSequenzaDaVisualizzare+(YTopo)/8
EndIf
EndIf
;---------------------------
;se avete premuto un gadget
;if you have pressed a gadget
;-----------------------------
Case #HaiPremutoUnGadget
Select GadgetHit
; Case 1
; WLocate 0,AltezzaSchermo-(AltezzaFonte+3)-8-8:WColour 0,0:Print SPACE$(80)
Case 2
LunghezzaSlider=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
PrimaSequenzaDaVisualizzare=ValoreSlider{2,500-SequenzeVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
End Select
;------------------------------
;se avete rilasciato un gadget
;if you have released a gadget
;------------------------------
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
LunghezzaSlider=640
BattuteAlMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
TicPerCinquantesimoDiSecondo=BattuteAlMinuto*192*4/3000
Case 2
LunghezzaSlider=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
PrimaSequenzaDaVisualizzare=ValoreSlider{2,500-SequenzeVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
End Select
;--------------------------------------
;se avete attivato il menu' principale
;if you have activated main menu
;--------------------------------
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=1
CaricaUnProgetto{}
ImpostaLaFinestraPrincipale{}
EndIf
If MenuHit=1 AND ItemHit=0
EseguiGliEventi{#EseguiGliEventiDallaFinestraPrincipale}
EndIf
If MenuHit=2 AND ItemHit=0
EditoreSuoni{}
EndIf
If MenuHit=2 AND ItemHit=1
If SequenzaSelezionata>0
EditoreSequenza{}
Else
EZRequest "AmySequencer message","You must select a sequence first","OK"
EndIf
EndIf
If MenuHit=3 AND ItemHit=0
AttivaMIDI{}
EndIf
If MenuHit=3 AND ItemHit=1
If Exists("ProjectsHistory")
CancellaLaStoriaDeiProgettiAperti{}
ImpostaLaFinestraPrincipale{}
EndIf
EndIf
;-------------------------------------------------------------------
;se avete scelto la voce Quit dal menu' Project attiva la variabile
; EsciDalProgramma
;if you have selected voice Quit from Project menu activates EsciDalProgramma
; flag
;------
If MenuHit=0 AND ItemHit=VoceMenuEsci Then EsciDalProgramma=True
;--------------------------
;se avete premuto un tasto
;if you have pressed a key
;--------------------------
Case #HaiPremutoUnTasto
;--------------------------------------------
;questa variabile memorizza il tasto premuto
;this variable store key pressed
;--------------------------------
TastoPremuto$=Inkey$
;-------------------------------------------------------------------
;se avete premuto il tasto Esc attiva la variabile EsciDalProgramma
;if you have typed Esc key activates EsciDalProgramma flag
;----------------------------------------------------------
If TastoPremuto$=TastoEsc$ Then EsciDalProgramma=True
End Select
;----------------------------------------------------------------
;ripete il ciclo se la variabile EsciDalProgramma e' disattivata
;repeats loop if EsciDalProgramma flag is deactivated
;-----------------------------------------------------
Until EsciDalProgramma=True
;----------------------
;fine del programma
;program end
;------------
End